Fork me on GitHub

【cuckoo沙箱系列3】分布式cuckoo沙箱搭建

因为分布式cuckoo沙箱在网上没看到什么教程,所以期间还走了挺多弯路,根本原因就是没有仔细地看一遍官方的手册,遗漏了一些细节。所以强烈建议搭建沙箱时完整看一遍官方的手册,网上的教程虽然看着方便但还是没这个全面。

最终实现的理想分布式cuckoo是:server控制n个worker,每个worker的virtualbox上配置了m个虚拟机。实现n*m个虚拟机同时运行恶意软件样本。

单cuckoo上增加vm

主要参考:https://blog.csdn.net/weixin_42651205/article/details/83900436

这里做的工作是为了让但cuckoo节点关联的virtualbox中,增加多个虚拟机。配置完成后,向改cuckoo节点下发多个任务时,cuckoo会自动调用多个虚拟机同时跑软件分析任务。

需要注意的就是深度copy虚拟机,然后修改新虚拟机的ip,不能和原来的一样,否则会冲突。
然后在cuckoo的配置文件里修改virtualbox.conf,machines=cuckoo1,cuckoo2,cuckoo3

1
2
3
4
5
6
7
8
9
10
11
[cuckoo2]
label = cuckoo2
platform = windows
ip = 192.168.56.201
snapshot = init_cuckoo
interface = vboxnet0
resultserver_ip =
resultserver_port =
tags =
options =
osprofile =

分布式cuckoo的部署

server端部署

https://cuckoo.sh/docs/usage/dist.html#setup-distributed-cuckoo

就用原有的配置文件,不用修改。server端只需要下面三个步骤,不要求要运行cuckoo -d
不sudo会出错

sudo cuckoo distributed server -H 0.0.0.0
root@ubuntu16:~/.cuckoo# supervisord -c supervisord.conf
root@ubuntu16:~/.cuckoo# supervisorctl start distributed
distributed: started
root@ubuntu16:~/.cuckoo#

开启server后,可以通过web访问查看各个挂载到server的worker节点的情况:

http://192.168.105.127:9003/

挂载成功的worker节点在Active processes这里会变成绿色的,如果是红色的,则可能是supervisorctl启动有问题。

worker节点部署

  • 需要在cuckoo config配置里把api调用的验证token去掉:

api_token =
# api_token = bZ0mLmUX2QElehFjI33OOQ

  • 开启api

nohup cuckoo api –host 192.168.2.136 &

  • 注册当前节点到server

curl http://192.168.105.127:9003/api/node -F name=tmy -F url=http://192.168.2.136:8090/

1
2
3
supervisord -c supervisord.conf
supervisorctl start cuckoo:
supervisorctl start distributed

如果修改了cuckoo的配置,需要supervisorctl stop cuckoo:停止之后重启。

之前有尝试过修改mongo数据库地址,只是重启了cuckoo -d没有stop,这种情况下提交样本后报告存储的路径还是旧的mongo地址。

ditributed下发任务到指定node

python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
REST_URL = "http://192.168.105.127:9003/api/task"
SAMPLE_FILE = "/home/tangmingyu/TEST_CUCKOO/f-mydoom.exe"
params = {
'timeout':60,
'priority':6,
'node': 'tmy'
}
with open(SAMPLE_FILE, "rb") as sample:
files = {"file": ("temp_file_name", sample)}
print files
r = requests.post(REST_URL, files=files,data=params)
print r.status_code
print r.text

常用api整理

指令 功能
curl http://192.168.105.127:9003/api/node 获得当前挂载到server的所有worker节点信息
curl http://192.168.2.136:9003/api/node -F name=localhost -F url=http://192.168.2.136:8090/ 注册一个node到server
curl http://192.168.105.127:9003/api/node/tmy 通过名称获得当前挂载到server的某个worker节点信息
curl -XDELETE http://192.168.105.127:9003/api/node/tmy disable某个节点(不会删除,只是修改状态)
curl http://192.168.105.127:9003/api/task -F file=@/home/tangmingyu/文档/安全沙箱安装/恶意软件样本/test2.exe 提交本地文件到分布式沙箱server
curl http://192.168.105.127:9003/api/task/2 获得序号为x的task的基本信息
-------------本文结束感谢您的阅读-------------